#!/usr/bin/env python
# encoding:utf-8
# @Time   : 2020/2/26
# @Author : 茶葫芦
# @Site   : 
# @File   : tools.py

import os
import pandas as pd
import pathlib
import signal
import sys

from settings import excel_path,table_cols_sheet,es_cols_map_sheet
project_path = pathlib.Path(os.path.abspath(__file__)).parent.parent.parent
sys.path.append(str(project_path))
from utility.import_log import flog
log = flog(__file__)


def timeout(secs):
    """
    超时secs秒数发起TimeOutError异常
    :param secs:
    :return:
    """
    def dec(func):
        def handler(signum,frame):
            raise TimeoutError("函数执行超时")
        def wrapper(*args,**kwargs):
            try:
                signal.signal(signal.SIGALRM,handler)
                signal.alarm(secs)
                result = func(*args,**kwargs)
                signal.alarm(0)
                return result
            except Exception as e:
                log.error(e)
                raise e
        return wrapper
    return dec


def get_csv_cols(filepath):
    """
    取列标题，只取第一行，避免将整个csv载入内存，取完立即释放
    """
    with open(filepath, 'r', encoding='UTF-8-sig') as f:
        cols_title = f.readline()
    return cols_title.strip().split(',')

def load_xls_config():
    """
    将excel文件处理成dict配置信息
    """
    log.info('加载Excel配置文件')
    # 表列对应及列信息
    table_cols_df = pd.read_excel(excel_path, sheet_name=table_cols_sheet, dtype=str,keep_default_na=False)
    # es,列信息对应关系
    es_cols_map_df = pd.read_excel(excel_path, sheet_name=es_cols_map_sheet, dtype=str,keep_default_na=False)

    tc_df = table_cols_df[['P9表英文名','P9字段名']]
    table_cols_dict ={}
    ########################################
    # table_cols_dict 构造{表：[字段列表],}字典
    ########################################
    for t in tc_df['P9表英文名'].unique():
        cols = tc_df[tc_df['P9表英文名']==t]['P9字段名'].tolist()
        table_cols_dict[t]=cols
    # table_to_es_cols_dict 入es列table和es列对照字典
    table_to_es_cols_dict = dict(zip(es_cols_map_df['表头字段名'].tolist(),es_cols_map_df['映射类型'].tolist()))
    log.info('table_cols_dict 构造{表：[字段列表],}字典 成功')
    #########################
    # table_to_es_cols_json_list 入es table字段名es属性对应表集合
    # [{'value': '贷款金额', 'attr': 'amount', 'table': 'loan', 'is_attr': True},。。。]
    #########################
    struct_df = table_cols_df[table_cols_df['字段中文名入库ES']=='是']
    # table字段名相关字段
    cols_list = ['字段中文名在ES中的类型','字段中文名入到ES中的index','字段中文名入到ES中的field',\
                 '字段中文名入到ES的attr field的值','字段中文名入到ES的table field的值',\
                 '字段中文名入到ES的is_attr field的值','表中文名']
    es_names = [table_to_es_cols_dict[c] for c in cols_list]
    # 拿到es中对应的列名后，将value列替换成‘字段中文名’ 取具体值
    cols_list =['字段中文名' if c=='字段中文名入到ES中的field' else c for c in cols_list]
    struct_df = struct_df[cols_list]
    table_to_es_cols_json_list = []
    for indexs in struct_df.index:
        table_to_es_cols_json_list.append(dict(zip(es_names,struct_df.loc[indexs].values.tolist())))
    log.info('table_to_es_cols_json_list 入es table字段名es属性对应表集合 构造成功')
    ###############################
    # value_es_cols_dict 各列值入es的格式dict
    # {table:{column1:{'attr': 'name', 'table': 'personal', 'is_attr': False}...},...}
    ###############################
    value_cols_df = table_cols_df[table_cols_df['字段的值入库ES'] == '是']
    value_cols_list = ['字段的值在ES中的类型','字段的值入到ES中的index','字段的值入到ES中的field',\
                       '字段的值入到ES的attr field的值','字段的值入到ES的table field的值',\
                       '字段的值入到ES的is_attr field的值','表中文名']
    # attr field 与 P9字段名对应 table field 值为 P9表名 去掉 t0202_kgem_前缀，
    value_cols_df = value_cols_df[value_cols_list]
    value_cols_json_list =[]
    value_es_names = [table_to_es_cols_dict[c] for c in value_cols_list]
    for indexs in value_cols_df.index:
        value_cols_json_list.append(dict(zip(value_es_names,value_cols_df.loc[indexs].values.tolist())))

    value_es_cols_dict = {}
    t_dict = {}
    for d in value_cols_json_list:
        table = 't0202_kgem_' + d.get(table_to_es_cols_dict['字段的值入到ES的table field的值'])
        colname = d.get(table_to_es_cols_dict['字段的值入到ES的attr field的值'])
        t_dict = value_es_cols_dict.get(table,{table:{}})
        if t_dict == {table:{}}:
            t_dict[table][colname]=d
            value_es_cols_dict.update(t_dict)
        else:
            t_dict[colname] = d
            value_es_cols_dict.update({table:t_dict})

    log.info('value_es_cols_dict 各列值入es的格式dict 构造成功')
    return table_cols_dict,table_to_es_cols_json_list,value_es_cols_dict



if __name__ == '__main__':
    table_cols_dict,table_to_es_cols_json_list,value_es_cols_dict = load_xls_config()
    print('table_cols_dict:')
    print(table_cols_dict)
    print('table_to_es_cols_json_list:')
    print(table_to_es_cols_json_list)
    print('value_es_cols_dict:')
    print(value_es_cols_dict)